﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.Office.Server.SocialData;
using Microsoft.SharePoint.Taxonomy;
using System.Web;
using System.IO;
using System.Globalization;
using System.Security.Principal;
using System.Reflection;

namespace SPSocialUtil.SocialTagCloud
{
    /// <summary>
    /// 커스텀 태그를 쉽게 추가할 수 있도록 기능을 제공합니다.
    /// </summary>
    public class TagManager
    {
        string MySPsiteUrl;
        string MyTStoreName;
        string MyTGroupName;
        string MyTSetName;
        Term MyTerm;

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="SPsiteUrl">SPsite Url 주소</param>
        public TagManager(string SPsiteUrl)
        {
            MySPsiteUrl = SPsiteUrl;
            MyTStoreName = "Managed Metadata Service";
            MyTGroupName = "시스템";
            MyTSetName = "키워드";
        }

        /// <summary>
        /// 새로운 태그를 입력합니다
        /// </summary>
        /// <param name="tagString">";"로 구분되는 태그단어모음 (해;달;별)</param>
        /// <param name="tagUrl">태그를 모아서 저장할 공유 Url</param>
        /// <param name="tagTitle">공유 Url의 타이틀</param>
        public void AddTag(string tagStrings, string tagUrl, string tagTitle)
        {
            //아래의 절차대로 작업을 수행합니다
            //2. ;를 구분자로 해서 tagStrings 를 배열로 분해한다.
            //3. 전달받은 socialTag 가 ManagedMetadata 의 KeyWord 로 존재해야 합니다
            //3-1. 존재하지 않는 다면 새로운 KeyWord 로 추가 합니다
            //4. 새로운 소셜태그를 추가 합니다.

            if (tagStrings == "") return;
            if (tagUrl == "") return;
            if (tagTitle == "") return;

            using (SPSite mysite = new SPSite(MySPsiteUrl))
            {
                TaxonomySession Tsession = new TaxonomySession(mysite);
                TermSet Tset = Tsession.TermStores[MyTStoreName].Groups[MyTGroupName].TermSets[MyTSetName];
                SPServiceContext sContext = SPServiceContext.GetContext(mysite);
                SocialTagManager sManager = new SocialTagManager(sContext);

                foreach (string tagString in tagStrings.Split(';'))
                {
                    string trimedtagString = tagString.Trim();
                    //3
                    TermCollection Tcoll = Tset.GetTerms(trimedtagString, true);
                    if (Tcoll.Count == 0)
                    {
                        Tset.CreateTerm(trimedtagString, 1042);
                        Tset.TermStore.CommitAll();
                        MyTerm = Tset.GetTerms(trimedtagString, true)[0];
                    }
                    else
                    {
                        MyTerm = Tcoll[0];
                    }

                    try
                    {
                        sManager.AddTag(new System.Uri(tagUrl), MyTerm, tagTitle);
                    }
                    catch (Exception ex)
                    { }
                }

            }

        }
    }
}
